﻿using System.Collections.Generic;
using Architecture.BusinessLayer;
using LASLogic.BusinessLayer.DataModel;
using LASLogic.DataLayer.Implementor;

namespace LASLogic.BusinessLayer.Requestor
{
    public class CompanyRequestor : IRequestor
    {
        #region Public Methods

        /// <summary>
        /// Metodo que permite insertar una nueva compañía a la base de datos
        /// </summary>
        /// <param name="name">Nombre de la compañia</param>
        /// <param name="taxIdentification">Cedula Juridica de la compañia</param>
        /// <param name="logo">Logotipo de la compañía</param>
        /// <param name="systemCurrency">Moneda del sistema</param>
        /// <param name="localCurrency">Moneda Local</param>
        /// <returns>Indicador si la compañía se inserto en la base de datos</returns>
        public bool InsertNewCompany(string name, string taxIdentification, byte[] logo, string systemCurrency, string localCurrency)
        {
            return CompanyDataManager.GetInstance().InsertNewCompany(name, taxIdentification, logo, systemCurrency, localCurrency);
        }

        /// <summary>
        /// Permite obtener todas las compañias de la base de datos
        /// </summary>  
        /// <returns>Lista de compañias de la base de datos</returns>
        public List<Company> GetCompanies()
        {
            return CompanyDataManager.GetInstance().GetCompanies();
        }


        /// <summary>
        /// Permite obtener todas las compañias de la base de datos
        /// </summary>  
        /// <returns>Lista de compañias de la base de datos</returns>
        public Company GetCompany(int companyId)
        {
            return CompanyDataManager.GetInstance().GetCompany(companyId);
        }

        /// <summary>
        /// Método que permite obtener el balance de comprobacion de una empresa
        /// </summary>
        /// <param name="companyId"></param>
        /// <param name="reporte"></param>
        /// <returns>Compañia que se desea obtener el balance</returns>
        public List<Reportes> GetReporte(int companyId, string reporte)
        {
            return CompanyDataManager.GetInstance().GetReporte(companyId, reporte);
        }

        /// <summary>
        /// Método que permite obtener el estado de resultados de una empresa
        /// </summary>
        /// <param name="companyId"></param>
        /// <returns>Compañia que se desea obtener el estado de resultados</returns>
        public List<Reportes> GetEstadoResultados(int companyId)
        {
            return CompanyDataManager.GetInstance().GetEstadoResultados(companyId);
        }

        /// <summary>
        /// Método que permite obtener el estado de resultados de una empresa
        /// </summary>
        /// <param name="companyId"></param>
        /// <returns>Compañia que se desea obtener el estado de resultados</returns>
        public List<Reportes> GetBalanceGeneral(int companyId)
        {
            return CompanyDataManager.GetInstance().GetBalanceGeneral(companyId);
        }

        /// <summary>
        /// Método que permite obtener todos los periodos contables de una compañia
        /// </summary>
        /// <param name="periodId">Indentificador del periodo</param>
        /// <returns>Compañia que se deseaba obtener</returns>
        public List<AccountingMonth> GetAccountingMonths(int periodId)
        {
            return CompanyDataManager.GetInstance().GetAccountingMonths(periodId);
        }

        /// <summary>
        /// Método que permite obtener todos los periodos contables de una compañia
        /// </summary>
        /// <param name="companyId">Identificador de la compañía</param>
        /// <returns>Periodos contables de la compañía</returns>
        public List<AccountingPeriod> GetAccountingPeriods(int companyId)
        {
            return CompanyDataManager.GetInstance().GetAccountingPeriods(companyId);
        }


        /// <summary>
        /// Permite cambiar el estado de un mes contable a otro
        /// </summary>
        /// <param name="monthId">mes al que se le quiere cambiar el estado</param>
        /// <param name="monthStatus">estado que se convertira en el nuevo mes</param>
        /// <returns>Booleano indicando el estado de la operacion realizada</returns>
        public bool ChangeMonthStatus(int monthId, string monthStatus)
        {
            return CompanyDataManager.GetInstance().ChangeMonthStatus(monthId, monthStatus);
        }



        /// <summary>
        /// Permite obtener las monedas de una compañia
        /// </summary>
        /// <param name="companyId">identificador de la compañia</param>
        /// <returns>Las Monedas de una compañia</returns>
        public List<Currency> GetCompanyCurrencies(int companyId)
        {
            return CompanyDataManager.GetInstance().GetCompanyCurrencies(companyId);
        }

        /// <summary>
        /// Permite añadir telefonos a una compañía
        /// </summary>
        /// <param name="phoneType">Tipo de telefono</param>
        /// <param name="companyId">Id de la compañía</param>
        /// <param name="telefono">Telefono de la compañia</param>
        /// <returns>Booleano que indica si el telefono se añadio correctamente</returns>
        public bool AddPhonesToCompany(string phoneType, int companyId, string telefono)
        {
            return CompanyDataManager.GetInstance().AddPhonesToCompany(phoneType, companyId, telefono);
        }

        /// <summary>
        /// Permite obtener las ciudades para un estado
        /// </summary>
        /// <returns>Lista de las ciudades</returns>
        public List<City> GetCities(int stateId)
        {
            return CompanyDataManager.GetInstance().GetCities(stateId);
        }

        /// <summary>
        /// Permite obtener los estados para un pais
        /// </summary>
        /// <returns>Retorna una lista de estados</returns>
        public List<State> GetStates(int paisId)
        {
            return CompanyDataManager.GetInstance().GetStates(paisId);
        }


        /// <summary>
        /// Permite obtener los paises
        /// </summary>
        /// <returns>Lista de los paises</returns>
        public List<Country> GetCountries()
        {
            return CompanyDataManager.GetInstance().GetCountries();
        }

        #endregion

        #region Singleton

        /// <summary>
        /// Única instancia de esta clase
        /// </summary>
        private static CompanyRequestor _instance;

        protected CompanyRequestor()
        {
        }

        /// <summary>
        /// Método para implementar el patrón de Singleton
        /// </summary>
        /// <returns>Instancia única de la clase</returns>
        public static CompanyRequestor GetInstance()
        {
            if (_instance == null)
                _instance = new CompanyRequestor();
            return _instance;
        }

        #endregion
    }
}